// Normalizes inputs and readies them for multiplication
`timescale 1ns/10ps
`include "constants.v"				 

module prenorm(a, b, norma, normb, modexpa, modexpb, aisdenorm, bisdenorm);

  input	[`WIDTH-1:0]	a, b;			
  output [`WSIG:0]	norma, normb;		
  output [`WEXPSUM-1:0]	modexpa, modexpb;	
  input			aisdenorm;		
  input			bisdenorm;		

  wire	[`WEXPSUM-1:0]	expa, expb;		
  wire	[`SHIFT-1:0]	shifta, shiftb; 	
  wire [`WSIG:0]	shifteda, shiftedb;	

  assign expa 	= a[`WIDTH-2:`WIDTH-1-`WEXP];
  assign expb 	= b[`WIDTH-2:`WIDTH-1-`WEXP];

  assign shifta =a[23 - 1] ? 1 :
                 a[23 - 2] ? 2 :
                 a[23 - 3] ? 3 :
                 a[23 - 4] ? 4 :
                 a[23 - 5] ? 5 :
                 a[23 - 6] ? 6 :
                 a[23 - 7] ? 7 :
                 a[23 - 8] ? 8 :
                 a[23 - 9] ? 9 :
                 a[23 - 10] ? 10 :
                 a[23 - 11] ? 11 :
                 a[23 - 12] ? 12 :
                 a[23 - 13] ? 13 :
                 a[23 - 14] ? 14 :
                 a[23 - 15] ? 15 :
                 a[23 - 16] ? 16 :
                 a[23 - 17] ? 17 :
                 a[23 - 18] ? 18 :
                 a[23 - 19] ? 19 :
                 a[23 - 20] ? 20 :
                 a[23 - 21] ? 21 :
                 a[23 - 22] ? 22 :
                 23; 
assign shiftb =  b[23 - 1] ? 1 :
                 b[23 - 2] ? 2 :
                 b[23 - 3] ? 3 :
                 b[23 - 4] ? 4 :
                 b[23 - 5] ? 5 :
                 b[23 - 6] ? 6 :
                 b[23 - 7] ? 7 :
                 b[23 - 8] ? 8 :
                 b[23 - 9] ? 9 :
                 b[23 - 10] ? 10 :
                 b[23 - 11] ? 11 :
                 b[23 - 12] ? 12 :
                 b[23 - 13] ? 13 :
                 b[23 - 14] ? 14 :
                 b[23 - 15] ? 15 :
                 b[23 - 16] ? 16 :
                 b[23 - 17] ? 17 :
                 b[23 - 18] ? 18 :
                 b[23 - 19] ? 19 :
                 b[23 - 20] ? 20 :
                 b[23 - 21] ? 21 :
                 b[23 - 22] ? 22 :
                 23; 

  assign modexpa = aisdenorm ? 1 - shifta : expa; 
  assign modexpb = bisdenorm ? 1 - shiftb : expb; 

  assign shifteda = a[`WSIG-1:0] << shifta;
  assign norma 	= aisdenorm ? shifteda : {1'b1, a[`WSIG-1:0]};

  assign shiftedb = b[`WSIG-1:0] << shiftb;
  assign normb 	= bisdenorm ? shiftedb : {1'b1, b[`WSIG-1:0]};

endmodule